<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
<head>
  <link href="https://gmpg.org/xfn/11" rel="profile">
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="generator" content="Hugo 0.68.3" />

  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>我的博客</title>
  <meta name="description" content="这里是任永刚的个人博客" />

  
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/print.css" media="print">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/poole.css">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/syntax.css">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/hyde.css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Abril+Fatface|PT+Sans:400,400i,700">


  
  <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/apple-touch-icon-144-precomposed.png">
  <link rel="shortcut icon" href="/favicon.png">

  
  <link href="/my_technology_blog/index.xml" rel="alternate" type="application/rss+xml" title="我的博客" />
  
</head>

  <body class="theme-base-09 ">
  <aside class="sidebar">
  <div class="container sidebar-sticky">
    <div class="sidebar-about">
      <a href="/my_technology_blog/"><h1>我的博客</h1></a>
      <p class="lead">
       这里是任永刚的个人博客 
      </p>
    </div>

    <nav>
      <ul class="sidebar-nav">
        <li><a href="/my_technology_blog/">Home</a> </li>
        
      </ul>
    </nav>

    <p>&copy; 2020. All rights reserved. </p>
  </div>
</aside>

    <main class="content container">
    <div class="posts">
<article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test14/">jwt</a>
  </h1>
  <time datetime="2020-05-07T00:00:00Z" class="post-date">Thu, May 7, 2020</time>
  JWT JSON Web Token（JWT）是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
一个JWT实际上就是一个字符串，它由三部分组成，头部、载荷与签名。
头部（Header）
头部用于描述关于该JWT的最基本的信息，例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。
{&ldquo;typ&rdquo;:&ldquo;JWT&rdquo;,&ldquo;alg&rdquo;:&ldquo;HS256&rdquo;}
在头部指明了签名算法是HS256算法。 我们进行BASE64编码http://base64.xpcha.com/，编码后的字符串如下：
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9  载荷（playload）
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品，这些有效信息包含三个部分
（1）标准中注册的声明（建议但不强制使用）
iss: jwt签发者 sub: jwt所面向的用户 aud: 接收jwt的一方 exp: jwt的过期时间，这个过期时间必须要大于签发时间 nbf: 定义在什么时间之前，该jwt都是不可用的. iat: jwt的签发时间 jti: jwt的唯一身份标识，主要用来作为一次性token。  （2）公共的声明
公共的声明可以添加任何的信息，一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息，因为该部分在客户端可解密.
（3）私有的声明
私有声明是提供者和消费者所共同定义的声明，一般不建议存放敏感信息，因为base64是对称解密的，意味着该部分信息可以归类为明文信息。
这个指的就是自定义的claim。比如前面那个结构举例中的admin和name都属于自定的claim。这些claim跟JWT标准规定的claim区别在于：JWT规定的claim，JWT的接收方在拿到JWT之后，都知道怎么对这些标准的claim进行验证(还不知道是否能够验证)；而private claims不会验证，除非明确告诉接收方要对这些claim进行验证以及规则才行。
定义一个payload:
{&quot;sub&quot;:&quot;1234567890&quot;,&quot;name&quot;:&quot;John Doe&quot;,&quot;admin&quot;:true}  然后将其进行base64加密，得到Jwt的第二部分。
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9  签证（signature）
jwt的第三部分是一个签证信息，这个签证信息由三部分组成：
header (base64后的) payload (base64后的) secret  这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串，然后通过header中声明的加密方式进行加盐secret组合加密，然后就构成了jwt的第三部分。
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ  注意：secret是保存在服务器端的，jwt的签发生成也是在服务器端的，secret就是用来进行jwt的签发和jwt的验证，所以，它就是你服务端的私钥，在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test13/">redis事物</a>
  </h1>
  <time datetime="2020-05-02T00:00:00Z" class="post-date">Sat, May 2, 2020</time>
  1. redis事物介绍 1. redis事物是可以一次执行多个命令，本质是一组命令的集合。 2. 一个事务中的所有命令都会序列化，按顺序串行化的执行而不会被其他命令插入 作用：一个队列中，一次性、顺序性、排他性的执行一系列命令  2. redis事物基本使用 1. 下面指令演示了一个完整的事物过程，所有指令在exec前不执行，而是缓存在服务器的一个事物队列中 2. 服务器一旦收到exec指令才开始执行事物队列，执行完毕后一次性返回所有结果 3. 因为redis是单线程的，所以不必担心自己在执行队列是被打断，可以保证这样的“原子性” 注：redis事物在遇到指令失败后，后面的指令会继续执行  mysql的rollback与redis的discard的区别: 　1) mysql回滚为sql全部成功才执行,一条sql失败则全部失败,执行rollback后所有语句造成的影响消失 2) redis的discard只是结束本次事务,正确命令造成的影响仍然还在. &gt; multi（开始一个redis事物） incr books incr books &gt; exec （执行事物） &gt; discard （丢弃事物） 3. watch指令 1. watch其实就是redis提供的一种乐观锁，可以解决并发修改问题 2. watch会在事物开始前盯住一个或多个关键变量，当服务器收到exec指令要顺序执行缓存中的事物队列时 3. redis会检查关键变量自watch后是否被修改（包括当前事物所在的客户端） 4. 如果关键变量被人改动过，exec指令就会返回null回复告知客户端事物执行失败，这个时候客户端会选择重试 注：redis禁用在multi和exec之间执行watch指令，必须在multi之前盯住关键变量，否则会出错 
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test12/">图片上传</a>
  </h1>
  <time datetime="2020-04-29T00:00:00Z" class="post-date">Wed, Apr 29, 2020</time>
  vue里的代码 &lt;template&gt; &lt;div&gt; 添加商品&lt;input v-model=&quot;name&quot;&gt;&lt;br&gt; 价格&lt;input v-model=&quot;price&quot;&gt;&lt;br&gt; 商品照片&lt;input type=&quot;file&quot; id=&quot;ssss&quot;&gt;&lt;br&gt; &lt;button @click=&quot;add&quot;&gt;添加&lt;/button&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; export default { name: &quot;addcate&quot;, data:function () { return{ name:'', price:'', } }, methods: { add:function () { var data = new FormData(); data.append('name',this.name); data.append('price',this.price); var image =document.getElementById('ssss').files[0]; data.append('file',image); this.axios({ url:'/api/sadmin/addcate/', data:data, method:'post' }).then((res)=&gt;{ if (res.data.code==200){ this.$router.push({'path':'show'}) } alert(res.data.message) }).catch((err)=&gt;{ console.log(err) }) } } } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt;  views里的代码 class Addcate(APIView): def post(self,request): res={} name = request.
  
  <div class="read-more-link">
    <a href="/my_technology_blog/test12/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test11/">三方登陆-微博</a>
  </h1>
  <time datetime="2020-04-28T00:00:00Z" class="post-date">Tue, Apr 28, 2020</time>
  流程图 第三方登录实现效果：
1、点击登录 2、输入账号密码（如果新浪应用审核通过就可以使用新浪微博的任意账号，如果没有通过只能使用开发者所使用的的微博账号来登录）
3、登录成功！！
实现流程：
 所需条件：
 1、一个线上的域名
 2、新浪微博开发者（自己去注册）
 创建应用： 将下载的txt文件扔进线下服务器的根目录下，点击验证 将下图中的的代码复制到一个html页面中
测试代码
[php] view plain copy &lt;!DOCTYPE html&gt; &lt;html xmlns:wb=&quot;http://open.weibo.com/wb&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;UTF-8&quot;&gt; &lt;title&gt;云中梦&lt;/title&gt; &lt;script src=&quot;http://tjs.sjs.sinajs.cn/open/api/js/wb.js?appkey=160521825&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;wb:login-button type=&quot;3,2&quot; onlogin=&quot;login&quot; onlogout=&quot;logout&quot;&gt;登录按钮&lt;/wb:login-button&gt; &lt;/body&gt; &lt;script&gt; WB2.anyWhere(function(W){ W.widget.connectButton({ id: &quot;wb_connect_btn&quot;, type:&quot;3,2&quot;, callback : { login:function(o){ //登录后的回调函数 }, logout:function(){ //退出后的回调函数 } } }); }); &lt;/script&gt; &lt;/html&gt;  直接访问该页面就可以实现效果了！！！！！！！
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test10/">安装docker</a>
  </h1>
  <time datetime="2020-04-27T00:00:00Z" class="post-date">Mon, Apr 27, 2020</time>
  首先我们需要打开官方文档来查找在各种系统上安装docker的文档。 docker安装文档地址
我们选择社区版的安装文档。
p1.png
我们可以看到 docker支持云服务器安装，linux系统安装，以及MacOS和 Windows安装。
由于我使用的是linux的centos系统，所以我这里只介绍centos上的安装，其实只要按照文档上的步骤来，任何系统下的安装都是可以成功的。
CentOS安装docker
p2.png
我们打开对应的安装文档页面，按照文档的步骤来安装一下，我使用的是阿里云的轻量服务器，因此是可以联网访问的所以安装非常简单。
1.第一步如果系统内有老版本的docker，我们需要先删除之前的docker以及相关依赖。
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine  我们执行这段命令
p3.png
2.安装社区版docker
2.1 安装所需要的包。
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2  p4.png
p5.png
最后出现complete表示安装完成。
2.2 设置稳定的存储库
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo  p6.png
3.安装最新的社区版docker
sudo yum install docker-ce docker-ce-cli containerd.io  p7.png
p8.png
p9.png
  
  <div class="read-more-link">
    <a href="/my_technology_blog/test10/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test9/">python基础装饰器</a>
  </h1>
  <time datetime="2020-04-26T00:00:00Z" class="post-date">Sun, Apr 26, 2020</time>
  装饰器 1. 装饰器定义 不能修改被装饰函数的源代码，不能修改被装饰函数的调用方式，为其他函数添加其他功能  2. 使用高阶函数模拟装饰器 #! /usr/bin/env python # -*- coding: utf-8 -*- import time def timer(func): start_time = time.time() func() print '函数执行时间为', time.time() - start_time def test(): print '开始执行test' time.sleep(3) print 'test执行结束' timer(test) ''' 开始执行test test执行结束 函数执行时间为 3.00332999229 '''  3. 计算运行时间装饰器 import time def timer(func): #timer(test1) func=test1 def deco(*args,**kwargs): start_time = time.time() func(*args,**kwargs) #run test1 stop_time = time.time() print(&quot;running time is %s&quot;%(stop_time-start_time)) return deco @timer # test1=timer(test1) def test1(): time.
  
  <div class="read-more-link">
    <a href="/my_technology_blog/test9/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test8/">python基础</a>
  </h1>
  <time datetime="2020-04-23T00:00:00Z" class="post-date">Thu, Apr 23, 2020</time>
  进程 1. 进程定义 1. 进程是资源分配最小单位 2. 当一个可执行程序被系统执行（分配内存等资源）就变成了一个进程  进程定义拓展回答内容 1. 程序并不能单独运行，只有将程序装载到内存中，系统为它分配资源才能运行，这种执行的程序就称之为进程 2. 程序和进程的区别就在于：程序是指令的集合，它是进程运行的静态描述文本；进程是程序的一次执行活动，属于动态概念 3. 在多道编程中，我们允许多个程序同时加载到内存中，在操作系统的调度下，可以实现并发地执行。 4. 进程的出现让每个用户感觉到自己独享CPU，因此，进程就是为了在CPU上实现多道编程而提出的。 5. 进程之间有自己独立的内存，各进程之间不能相互访问 6. 创建一个新线程很简单，创建新进程需要对父进程进行复制  3. 进程间互相访问数据的四种方法 注：不同进程间内存是不共享的，所以互相之间不能访问对方数据 法1: 利用Queues实现父进程到子进程（或子进程间）的数据传递 法2: 使用管道pipe实现两个进程间数据传递 法3: Managers实现很多进程间数据共享 法4：借助redis中间件进行数据共享 
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/tsst7/">django基础知识</a>
  </h1>
  <time datetime="2020-04-22T00:00:00Z" class="post-date">Wed, Apr 22, 2020</time>
  1 Django创建项目的命令： django-admin startproject 项目名称 python manage.py startapp app名称  2Django 创建项目后，项目文件夹下的组成部分（对 mvt 的理解）？ manage.py是项目运行的入口，指定配置文件路径 __init.py 是一个空文件，作用是这个目录可以被当作包使用。 settings.py 项目整体配置文件 urls.py 是项目的路由配置文件 wsgi.py 是项目与 WSGI 兼容的 Web 服务器。  3对MVC,MTV的理解 首先；来说MVC M: model 模型，和数据库进行交互 V: view 视图，负责产生html文件以及吧文件传到页面上 C: Controller控制器，接收请求，进行处理，与 M 和 V 进行交互，返回应答  用户点击注册按钮，将要注册的内容发送给网站的服务器。 2、 View 视图，接收到用户发来的注册数据，View 告诉 Model 将用户的注册信息保存进数据库。 3、 Model 层将用户的注册信息保存到数据库中。 4、 数据库将保存的结果返回给 Model 5、 Model 将保存的结果给 View 视图。 6、 View 视图告诉 Template 模板去产生一个 Html 页面。 7、 Template 生成 html 内容返回给 View 视图 8、 View 将 html 页面内容返回给浏览器。 9、 浏览器拿到 view 返回的 html 页面内容进行解析，展示。  MTV是根据MVC演变的 Django 中 models 利用 ORM 对 Mysql 进行查表的语句 all():返回模型类对应表格中的所有数据。 get():返回表格中满足条件的一条数据，如果查到多条数据，则抛异常：MultipleObjectsReturned， 查询不到数据，则抛异常：DoesNotExist。 filter():参数写查询条件，返回满足条件 QuerySet 集合数据 模糊查询 like 例：查询书名包含’传’的图书。contains contains BookInfo.
  
  <div class="read-more-link">
    <a href="/my_technology_blog/tsst7/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/tsst6/">vue的组件</a>
  </h1>
  <time datetime="2020-04-22T00:00:00Z" class="post-date">Wed, Apr 22, 2020</time>
  vue的组件 1-1 底层学习组件 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素，封装可重用的代码。在较高层面上，组件是自定义元素，Vue.js 的编译器为它添加特殊功能。在有些情况下，组件也可以表现为用 is 特性进行了扩展的原生 HTML 元素。 //html &lt;div id=&quot;app&quot;&gt; &lt;my-test&gt;&lt;/my-test&gt; &lt;!--自定义标签--&gt; &lt;/div&gt; //js Vue.component('my-test',{ //注册组件 template:'&lt;div&gt;初学组件&lt;/div&gt;' }); new Vue({ el:&quot;#app&quot; })  1-2 父子组件通信 利用props进行传值 //局部组件 &lt;div id=&quot;app&quot;&gt; &lt;my-test msg=&quot;你好&quot;&gt;&lt;/my-test&gt; &lt;my-test msg=&quot;传值2&quot;&gt;&lt;/my-test&gt; &lt;/div&gt; //js new Vue({ el:&quot;#app&quot;, components:{ 'my-test':{ props:['msg'], template:'&lt;div&gt;{{msg}}&lt;/div&gt;' } } }) //全局组件 &lt;div id=&quot;app&quot;&gt; &lt;my-test msg=&quot;你好&quot;&gt;&lt;/my-test&gt; &lt;my-test msg=&quot;传值2&quot;&gt;&lt;/my-test&gt; &lt;/div&gt; //js Vue.component('my-test',{ props:['msg'], template:'&lt;div&gt;{{msg}}&lt;/div&gt;' })  如果需要传的值在vue的实例中 //html &lt;div id=&quot;app&quot;&gt; &lt;my-test v-bind:listData=&quot;list&quot;&gt;&lt;/my-test&gt; &lt;/div&gt; //js new Vue({ el:&quot;#app&quot;, data:{ list:[ {title:'这是数据'}, {title:'这是数据22'} ] }, components:{ 'my-test':{ props:['listData'], template:` &lt;select name=&quot;&quot; id=&quot;&quot;&gt; &lt;option v-for=&quot;item in listData&quot;&gt;{{item.
  
  <div class="read-more-link">
    <a href="/my_technology_blog/tsst6/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test2/">python基础列表常用方法</a>
  </h1>
  <time datetime="2020-04-21T00:00:00Z" class="post-date">Tue, Apr 21, 2020</time>
  1.1 列表常用方法 #1. append用于在列表末尾追加新的对象 a = [1,2,3] a.append(4) #the result ： [1, 2, 3, 4] #2. count方法统计某个元素在列表中出现的次数 a = ['aa','bb','cc','aa','aa'] print(a.count('aa')) #the result ： 3 #3. extend方法可以在列表的末尾一次性追加另一个序列中的多个值 a = [1,2,3] b = [4,5,6] a.extend(b) #the result ：[1, 2, 3, 4, 5, 6] #4. index函数用于从列表中找出某个值第一个匹配项的索引位置 a = [1,2,3,1] print(a.index(1)) #the result ： 0 #5. insert方法用于将对象插入到列表中 a = [1,2,3] a.insert(0,'aa') #the result : ['aa', 1, 2, 3] #6. pop方法会移除列表中的一个元素（默认是最后一个），并且返回该元素的值 a = [1,2,3] a.
  
  <div class="read-more-link">
    <a href="/my_technology_blog/test2/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test4/">python基础字典常用方法</a>
  </h1>
  <time datetime="2020-04-21T00:00:00Z" class="post-date">Tue, Apr 21, 2020</time>
  1.3 字典常用方法 #1. clear方法清除字典中所有的项，这是一个原地操作，所以无返回值（或则说返回None） d = {'name':&quot;tom&quot;} d.clear() print(d) #the result : {} #2. fromkeys方法使用给定的键建立新的字典，每个键都对应一个默认的值None print({}.fromkeys(['name','age'])) #the result　：　{'age': None, 'name': None} #3. get方法是个更宽松的访问字典项的方法，如果试图访问字典中不存在的项时不会报错仅会 返回：None d = {'Tom':8777,'Jack':8888,'Fly':6666} print(d.get('Tom')) #the result ： 8777 print(d.get('not_exist')) #the result ： None #4. for循环字典的三种方法 d = {'Tom':8777,'Jack':8888,'Fly':6666} for k,v in d.items(): print(k,v) for k in d.values(): print(k) for k in d.keys(): print(k) #5. pop方法用于获得对应与给定键的值，然后将这个”键-值”对从字典中移除 d = {'Tom':8777,'Jack':8888,'Fly':6666} v = d.pop('Tom') print(v) #8777 #6. setdefault方法在某种程度上类似于get方法，能够获得与给定键相关联的值，除此之外，setdefault还能在字典中不含有给定键的情况下设定相应的键值 d = {'Tom':8777,'Jack':8888,'Fly':6666} d.
  
  <div class="read-more-link">
    <a href="/my_technology_blog/test4/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test3/">python基础字符串常用方法</a>
  </h1>
  <time datetime="2020-04-21T00:00:00Z" class="post-date">Tue, Apr 21, 2020</time>
  1.2 字符串常用方法 #1. find方法可以在一个较长的字符串中查找子串，他返回子串所在位置的最左端索引，如果没有找到则返回-1 a = 'abcdefghijk' print(a.find('abc')) #the result ： 0 print(a.find('abc',10,100)) #the result ： 11 指定查找的起始和结束查找位置 #2. join方法是非常重要的字符串方法，他是split方法的逆方法，用来连接序列中的元素，并且需要被连接的元素都必须是字符串。 a = ['1','2','3'] print('+'.join(a)) #the result ： 1+2+3 #3. split方法,是一个非常重要的字符串，它是join的逆方法，用来将字符串分割成序列 print('1+2+3+4'.split('+')) #the result ： ['1', '2', '3', '4'] #4. strip 方法返回去除首位空格（不包括内部）的字符串 print(&quot; test test &quot;.strip()) #the result ：“test test” #5. replace方法返回某字符串所有匹配项均被替换之后得到字符串 print(&quot;This is a test&quot;.replace('is','is_test')) #the result ： This_test is_test a test  
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test1/">python常见的设计模式</a>
  </h1>
  <time datetime="2020-04-21T00:00:00Z" class="post-date">Tue, Apr 21, 2020</time>
  1，单例模式（只能创建一个对象） 1、单例模式介绍 内容：保证一个类只有一个实例，并提供一个访问他的全局访问点 使用场景：当类只能有一个实例而且客户可以从一个总所周知的访问点访问他 例： 比如Test是一个类，你创建两个对象a=Test(), b=Test()在单例模式下a,b两个对象相同 优点： 1、 对唯一实例的受控访问（比如写日志时的日志句柄） 2、 单例模式相当于全局变量，单例模式防止了命名空间被污染  · 单例模式使用 from abc import abstractmethod, ABCMeta class Singleton(object): def __new__(cls, *args, **kwargs): #new方法最后返回的是一个实例 if not hasattr(cls, &quot;_instance&quot;): #如果没有这个字段就调用父类创建 cls._instance = super(Singleton, cls).__new__(cls) return cls._instance #永远返回的就是第一次创建的对象 class MyClass(Singleton): def __init__(self, name=None): if name: #如果不传参数就不必赋值 self.name = name a = MyClass(&quot;a&quot;) #第一次创建对象时传入的是&quot;a&quot;,所以a.name=a print(a) print(a.name) b = MyClass('b') #第二次创建对象时传入的是&quot;b&quot;，所以将name改成了b,所以b.name=b print(b) print(b.name) print(a) #在b创建实例化后name值已经改成了b所以 a.name=b print(a.name) # 注：可以看到实例a和b内存地址相同时一个实例 # &lt;__main__.MyClass object at 0x00FBACB0&gt; # a # &lt;__main__.
  
  <div class="read-more-link">
    <a href="/my_technology_blog/test1/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/test5/">安装Hugo</a>
  </h1>
  <time datetime="2020-04-21T00:00:00Z" class="post-date">Tue, Apr 21, 2020</time>
  安装Hugo 如果你是macOS用户，请使用Homebrew快速安装 brew install hugo 1 如果你是Windows用户，请使用Chocolatey或者Scoop快速安装，取决于你使用什么包管理 choco install hugo -confirm 1 scoop install hugo 1 如果你是Debian或Ubuntu用户，请使用apt快速安装 sudo apt-get install hugo  
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/one/">个人简历</a>
  </h1>
  <time datetime="0001-01-01T00:00:00Z" class="post-date">Mon, Jan 1, 0001</time>
  任永刚
23 岁 | 男 | 本科 | 4 年经验
199～9527～5120 | 博客：http://renyonggang.gitee.io/my_technology_blog/
个人简介 ：
我有 4 年的 python 相关开发经验，能独立开发项目，能熟练运用 MVC 设计模式，Django、Flask 框架， 来提高应用性能和代码的质量，具备较强的逻辑思维，对事情认真负责，能承担较大工作压力，团队意识强，有 较好的沟通能力和自学能力，工作态度积极，能快速的接受新的技术并使用在项目的开发中。  期望职位
Python 北京 12-20K 不限  专业技能
后端框架：Django, Flask, Scrapy 前端框架：Vue.js,Node.js 数据库：MySQL,redis,Mongodb 工具：Docker,Git,Jenkins,vnc 其他：TCP/IP, HTTP  工作经历：
文思海辉技术有限公司
Python 中级全栈开发工程师 | 技术部 | 时间：2016.08—2019.08
项目经历
在线教育 python 全栈开发 2017.01—2017.04  项目职责：
负责项目详情迭代开发，增加标签及活动介绍，优化详情页加载  项目描述：
结合 restfull 规范开发的一个在线视频教育平台，另含一个后台管理平台，基于角色的管理 控制以及在线视频播放和直播传授等。  教育经历
北京科技大学 计算机科学与技术 | 本科 2012—2016
  
</article>
</div>
    </main>

    
      
    
  </body>
</html>
